Workflowsからコネクタを用いてCloud Runジョブを起動する
概要
WorkflowsにはGoogle Cloudのリソースを使用するためのさまざまなコネクタが用意されています。
サポートされているコネクタに関しては以下に一覧の記載があります。
もちろん、Cloud Run ジョブを起動するためのコネクタ(以下)も用意されています。
googleapis.run.v1.namespaces.jobs.run
今回はこのコネクタを用いて、Cloud Run ジョブをWorkflowsから起動してみます。
そもそもコネクタとは
コネクタとはGoogle Cloudの各種リソースに対して簡単にアクセスできるように用意されたものです。
call: コネクタ
の形式で呼び出すことができ、各コネクタごとにさまざまなパラメータの設定が可能です。
コネクタを用いるとGoogle Cloudの各種リソースをWorkflowsから呼び出すことが容易になります。
各種設定値をYAMLまたはJSONにて記載することでリソース呼び出し時の設定を実装することができます。各コネクタごとにリファレンスも整備されていて、容易にリソース呼び出しをすることができます。
以下はCloud Storageのコネクタのサンプルリファレンスです。
注意点
Cloud Run関数(旧:Cloud Functions関数)等の呼び出し時に用いるHTTPリクエストとコネクタ呼び出しは異なるものです。リファレンスにも以下の通り記載があります。
注: ワークフロー コネクタによって推進される API オペレーションは、Cloud Functions や Cloud Run などの Google Cloud サービスの呼び出しと混同しないでください。これは HTTP リクエストを介して行われます。
※引用:コネクタを理解する
WorkflowsからCloud Run関数(旧:Cloud Functions関数)を起動する際に用いる命令は
call: http.get
やcall: http.post
ですがこれらはコネクタではなく Workflowsのライブラリのhttp.xxx
によってHTTPリクエストが実行されます。
コネクタの場合はcall: コネクタ名
となります。例えばCloud Run ジョブを起動する場合は
call: googleapis.run.v1.namespaces.jobs.run
となります。
実際にCloud Run ジョブをコネクタで起動する方法
準備:Cloud Run ジョブの作成
まずWorkflowsから起動するCloud Run ジョブを作成します。
Cloud Run ジョブの内容は簡素なもので、Workflowsから起動されると、Workflowsから渡した環境変数の値を出力するというものです。
以下のファイルを作成します。
- deploy.sh : デプロイ用スクリプト
- Dockerfile
- script.sh : 環境変数出力用スクリプト
gcloud run jobs deploy workflows-cloud-run-job \
--source . \
--region=asia-northeast1 \
--tasks=1 \
--cpu=1 \
--max-retries=0 \
--memory=512Mi \
--parallelism=1 \
--task-timeout=600 \
--set-env-vars "ENV_VAR=DEFAULT_VALUE" \
--region asia-northeast1
動作確認用のため最低限のスペック・並列数で作成しています。
FROM google/cloud-sdk:latest
COPY ./script.sh .
ENV ENV_VAR=DOCKERFILE_VAR
RUN chmod +x ./script.sh
CMD ["./script.sh"]
#!/bin/bash
echo "----環境変数開始----"
echo $ENV_VAR
echo "----環境変数終了----"
上記をローカルのフォルダに作成したら、以下のようにdeploy.shをshコマンドで実行します。(gcloudコマンドをコンソールで実行しても構いません)
sh deploy.sh
実行して少し待つと、Cloud Run ジョブのコンソールにジョブが作成されています。
準備:Workflowsの作成
Workflowsの準備をします。Workflowsの実装ですが、当然Cloud Run ジョブを起動するコネクタを用います。以下が実装です。
main:
steps:
- init:
assign:
- project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- job_name: cloud-run-job-test
- job_location: asia-northeast1
- callCloudRunJobStep:
steps:
- cloudRunJobsCall:
call: googleapis.run.v1.namespaces.jobs.run
args:
name: ${"namespaces/" + project_id + "/jobs/" + job_name}
location: ${job_location}
body:
overrides:
containerOverrides:
env:
- name: ENV_VAR
value: "Call From Workflows"
connector_params:
timeout: 3600
上記の処理の流れとしては以下となります。
- 環境変数からプロジェクトIDを取得、ジョブ名とジョブがあるリージョンを設定します
- cloudRunJobsCallステップで、Cloud Runジョブを実行します。Cloud Run ジョブ起動のコネクタであるAPIエンドポイント
googleapis.run.v1.namespaces.jobs.run
を呼び出し、引数で指定したジョブを実行します。 - ジョブの実行時に環境変数
ENV_VAR
を "Call From Workflows" に設定(オーバーライド)します connector_params
を用いてタイムアウトを3600秒(1時間)に設定しています
デプロイは以下のスクリプト(コマンドで行います)
gcloud workflows deploy cloud_run_jobs_test_workflow \
--location=asia-northeast1 \
--source=./workflows.yaml
Workflowsを実行してみる
作成したworkflowsを実行します。
Workflowsを実行したらCloud Run ジョブを見に行きます。
ジョブのログから、Workflowsで設定した環境変数の値Call From Workflows
が出力されていることが確認できました。無事Workflowsからコネクタを用いてCloud Run ジョブを起動することができました。
コネクタを使わない場合でWorkflowsからCloud Run ジョブを呼び出すには
一例としては、Cloud RunのREST APIを用います。
REST APIを用いてCloud Run ジョブを実行する場合は以下の実装になります(実行するのみで、環境変数のオーバーライドは行っていません)。
main:
steps:
- init:
assign:
- project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- job_name: workflows-cloud-run-job
- job_location: asia-northeast1
- callCloudRunJobStep:
steps:
- cloudRunJobsCall:
call: http.post
args:
url: ${"https://run.googleapis.com/v2/projects/" + project_id + "/locations/" + job_location + "/jobs/" + job_name + ":run"}
auth:
type: OAuth2
コネクタでの実行との違いはcall: http.post
でHTTPリクエストを行い、Cloud Run ジョブのREST APIのエンドポイントにPOSTしている点です。
また、http.post
で呼び出しをするためCloud Run ジョブの実行時間が30分に制限されます。
※Workflowsからのhttp.xxx
でのHTTPリクエストのタイムアウト上限が30分だからです。詳しくは以下の記事をご覧ください。
コネクタ呼び出しの場合、Cloud Run ジョブのタイムアウト上限は1年間となります(各サービスでタイムアウトなどの上限値は異なります)。
コネクタの使い方のリファレンスもあるので、特段の理由がなければhttpでの起動よりもコネクタでの起動の方が使い勝手は良いのではないかなと考えます。各種設定値を実装するのもコネクタの方が簡素化されるため容易です。
まとめ
Cloud Run ジョブをWorkflowsからコネクタ経由で実行してみました。
WorkflowsにはCloud Run ジョブ以外にもBigQueryやCloud StorageなどさまざまなGoogle Cloudのリソースへのコネクタが用意されています。Workflowsからアクセスしたいサービスがあった時にはまずはコネクタがないかを考えてみると良いのではないかなと考えます。
それではまた。ナマステー
参考